package controller

import (
	"bubble/models"
	"fmt"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

func InsertTodo(ctx *gin.Context) {
	var t models.Todo
	if err := ctx.BindJSON(&t); err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	err := t.Insert()
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{
		"code": 2000,
		"msg":  "success",
		"data": t,
	})
}

func GetAllTodo(ctx *gin.Context) {
	result, err := models.GetAllTodo()

	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, result)
}

func GetTodoById(ctx *gin.Context) {
	idStr := ctx.Param("id")

	var result models.Todo
	var err error
	result.Id, err = strconv.Atoi(idStr)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}
	err = result.GetTodoById()
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, result)
}

func UpdateTodoById(ctx *gin.Context) {
	idStr := ctx.Param("id")

	var err error
	var result models.Todo
	result.Id, err = strconv.Atoi(idStr)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	err = result.GetTodoById()
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	if (result == models.Todo{}) {
		ctx.JSON(http.StatusOK, gin.H{"error": fmt.Sprintf("%s不存在", idStr)})
		return
	}

	if err := ctx.BindJSON(&result); err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	err = result.UpdateTodoById()
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, result)
}

func DelTodoById(ctx *gin.Context) {
	idStr := ctx.Param("id")

	var result models.Todo
	var err error
	result.Id, err = strconv.Atoi(idStr)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}
	err = result.DelTodoById()
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"id": "deleted"})
}
